"""
遍历源文件夹中所有以"VID"开头的.mp4文件。
使用ffprobe工具获取每个视频的比特率。
如果视频比特率大于10Mbps，进行以下操作：
    生成输出文件名，在原文件名基础上添加"_crf23.mp4"。
    检查是否存在同名文件，如有则添加序号（如"_1.mp4"）避免覆盖。
    使用ffmpeg工具对视频进行压缩转码，参数为-crf 23 -c:v libx264 -preset veryfast -c:a copy，其中-crf 23表示设置视频质量，-c:v libx264表示使用H.264编码，-preset veryfast表示使用非常快的预设，-c:a copy表示音频流复制不做转码。
    检查压缩是否成功，如果返回码为0，则计算压缩比例和决定是否删除源文件或输出文件：
        计算压缩比例：(压缩前大小 - 压缩后大小) / 压缩前大小 * 100%。
        如果压缩后文件体积小于压缩前文件，删除源文件。
        否则，删除输出文件并打印提示信息。
    如果压缩失败，打印错误信息。
"""
import subprocess
from pathlib import Path

# 源文件夹路径
source_folder = Path(r"E:\2019-08-21 新疆8日游\全部照片")

# 遍历源文件夹中的所有.mp4文件
for video_path in source_folder.glob("**/*.*"):
    if (video_path.stem.startswith("MVI")
            and video_path.suffix.lower() in ['.mp4', '.avi', '.mkv', '.mov', '.wmv', '.flv', '.mpeg', '.mpg', '.3gp',
                                              '.webm']):
        # 使用ffprobe获取视频比特率
        cmd = f'ffprobe -v error -select_streams v:0 -show_entries stream=bit_rate -of default=noprint_wrappers=1:nokey=1 "{video_path}"'
        bitrate_process = subprocess.run(cmd, stdout=subprocess.PIPE, shell=True)
        bitrate = int(bitrate_process.stdout.decode().strip())

        if bitrate > 10 * 1000 * 1000:  # 10Mbps
            output_name = f"{video_path.stem}_crf23.mp4"
            output_path = video_path.parent / output_name

            # 检查是否存在同名文件
            duplicate_count = 1
            while output_path.exists():
                output_name = f"{video_path.stem}_{duplicate_count}.mp4"
                output_path = video_path.parent / output_name
                duplicate_count += 1

            cmd = f'ffmpeg -i "{video_path}" -crf 23 -c:v libx264 -preset veryfast -c:a copy "{output_path}"'
            try:
                compress_process = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)
            except Exception as e:
                print(f"处理文件时发生错误：{str(e)}")

            # 检查压缩是否成功
            if compress_process.returncode == 0:
                # 计算压缩比例
                before_size = video_path.stat().st_size
                after_size = output_path.stat().st_size
                compression_ratio = (before_size - after_size) / before_size * 100

                print(f"压缩成功：{video_path.name} -> {output_path.name} 压缩比例：{compression_ratio:.2f}%")

                if after_size < before_size:
                    video_path.unlink()  # 删除源文件
                else:
                    output_path.unlink()  # 删除输出文件
                    print("转码后文件体积大于转码前文件，已删除")
            else:
                print(f"压缩失败：{video_path}，错误信息：{compress_process.stderr.decode()}")
